iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0

前言

在系列文的第二篇我就提到過, 一個非同步運行框架, 應該要含有兩種架構, 一個是能夠 multi-thread 操作資料的介面, 一個是能夠進行 thread schedule 的 scheduler。

其中, 以 .Net 為例, 整個 Task 以及 Threadpool , 就是一個是能夠 multi-thread 操作資料的介面, scheduler 的部分則是外包給了外部檔案完成, 我們沒讀到。也因此, 我們迴避掉了不少困難的部分, 但在讀 node 的過程, 這兩個都是不可迴避的, 難度也因此相應提高, 所以我會在開始讀之前把在讀的過程中可能遇到的概念聊一下。

以下都是聊聊他們在 linux 中的樣子, node 會以他們為基礎, 去實踐自己的框架。

epoll

https://zh.wikipedia.org/wiki/Epoll

簡單來說,

epoll 是一種非同步監聽 IO 的方法, 其介面延續了 unix 核心 everything is a file 的精神, 利用對文件的讀寫來操作, 底層實踐則是透過給註冊的事件追加 callback function , 該 callback function 的功能是把發生的事件放入一個虛擬文件, 而 epoll 的等待是去讀該虛擬文件, 讀到事件就得知該事件發生。

以下簡述流程 :

  1. 建立空白虛擬文件, user space 可以直接讀取
  2. 利用 epoll 提供的註冊方法給被註冊的事件追加 callback function
  3. 事件發生, 觸發回調函數
  4. threads 利用 epoll 提供的等待方法, 等到事件發生, 將第 3 步的事件加入虛擬文件
  5. threads 讀取虛擬文件, 且處理該事件。

比較

若是拿出我在第二天寫的 httpServer 所使用的非同步方法, 可以發現高下立判, 如果使用這種演算法只要用以下方法設計, 效能遠超我在第二天撰寫的版本

  1. 給每次連線建立的 socket 註冊 epoll
  2. 所以每次 socket 傳輸的資料都直接寫入虛擬文件
  3. 接著 thread 只要去讀虛擬文件即可

如此一來我不需要建立那麼多 thread 在那邊空等, 只要利用一條 epoll 的 thread 就可以快速的處理所有連線並且資料都會自動的寫入虛擬文件。接著就是無腦的處理虛擬文件即可。

明天進度

因為 epoll 版 httpServer 很多人寫了, 就跳過不實作了, 改成用 windows 的 IOCP 撰寫 httpServer, 感覺會比較有趣。

所以明天來聊一下 IOCP 這個非同步監聽 IO 的方法吧

明天見 !


上一篇
[Day 14] .Net 非同步概念整理
下一篇
[Day 16] IOCP Input/Output Completion Port
系列文
從C到JS的同步非同步探索30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言